#coding=utf-8

import pandas as pd
import re

# 代码说明
# 校验函数 validate_credit_code:
#
# 检查代码是否为18位
#
# 检查最后一位是否为数字或字母X（不区分大小写）
#
# 处理了空值情况
#
# 主函数 split_excel_by_credit_code:
#
# 读取输入Excel文件
#
# 应用校验函数创建布尔掩码
#
# 将数据拆分为合规和不合规两部分
#
# 分别保存到两个Excel文件
#
# 使用说明:
#
# 修改 input_excel, output_valid, output_invalid 和 credit_code_column 变量以匹配您的实际需求
#
# 信用代码列名 credit_code_column 需要与Excel文件中的列名一致
#
# 注意事项
# 确保已安装必要的库：pandas 和 openpyxl（用于处理Excel文件）
#
# text
# pip install pandas openpyxl
# 如果信用代码列名不是"信用代码"，请修改 credit_code_column 变量。
#
# 代码处理了大小写问题，最后一位字母X不区分大小写。
#
# 如果需要更复杂的校验规则（如前17位必须为数字等），可以修改 validate_credit_code 函数。
def validate_credit_code(code):
    """
    校验企业信用代码是否合规
    规则：必须为18位，最后一位为数字或字母X（不区分大小写）
    """
    if pd.isna(code) or code is None:
        return False

    code = str(code).strip()
    # 检查长度是否为18位
    if len(code) != 18:
        return False

    # 检查最后一位是否为数字或X（不区分大小写）
    # last_char = code[-1].upper()
    # if not (last_char.isdigit() or last_char == 'X'):
    #     return False

    return True


def split_excel_by_credit_code(input_file, output_valid, output_invalid, code_column):
    """
    读取Excel文件，根据信用代码列拆分数据

    参数:
        input_file: 输入Excel文件路径
        output_valid: 合规数据输出文件路径
        output_invalid: 不合规数据输出文件路径
        code_column: 信用代码列名
    """
    try:
        # 读取Excel文件
        df = pd.read_excel(input_file)

        # 检查指定的列是否存在
        if code_column not in df.columns:
            raise ValueError(f"列 '{code_column}' 不存在于Excel文件中")

        # 应用校验函数
        mask = df[code_column].apply(validate_credit_code)

        # 拆分数据
        valid_df = df[mask]
        invalid_df = df[~mask]

        # 保存到两个Excel文件
        valid_df.to_excel(output_valid, index=False)
        invalid_df.to_excel(output_invalid, index=False)

        print(f"处理完成:\n- 合规数据: {len(valid_df)} 条, 已保存到 {output_valid}")
        print(f"- 不合规数据: {len(invalid_df)} 条, 已保存到 {output_invalid}")

    except Exception as e:
        print(f"处理过程中发生错误: {str(e)}")


# 使用示例
if __name__ == "__main__":
    # 输入输出文件路径
    input_excel = r"E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\全部补贴项目-国网数据处理\补贴项目维度\project全部补贴项目表【2025.06.27】.xlsx"  # 替换为你的Excel文件路径
    output_valid =r'E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\全部补贴项目-国网数据处理\补贴项目维度\valid.xlsx'
    output_invalid = r'E:\项目相关\13.可再生能源补贴\26.补贴项目功能扩展三期\13.数据对接\可再生数据 2\国网数据处理\全部补贴项目-国网数据处理\补贴项目维度\invalid.xlsx'
    credit_code_column = "项目业主ID"  # 信用代码列名（根据实际Excel调整）

    # 执行拆分
    split_excel_by_credit_code(input_excel, output_valid, output_invalid, credit_code_column)
